﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using nmConnectionDatabase;
using nmUsuarios;
using System.Data.SqlClient;

namespace DarkPassenger
{
    public partial class ImportarExcel : Form
    {
        string FormatoExcel = "";
        ConexionDB Conexion = new ConexionDB("Data Source=localhost;Initial Catalog=TPVideoJuegos;Integrated Security=True");

        public ImportarExcel() 
        {
            InitializeComponent();
            setComboboxes();
        }


        private void setComboboxes()
        {
            cmbImportar.SelectedIndex = 0;
        }

        private void btnAbrirArchivo_Click(object sender, EventArgs e)
        {
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                string FileName = openFileDialog1.SafeFileName;

                if (Path.GetExtension(FileName) == ".xls")
                {
                    txtArchivo.Text = openFileDialog1.FileName;
                    FormatoExcel = Path.GetExtension(FileName);
                }

                else if (Path.GetExtension(FileName) == ".xlsx")
                {
                    FormatoExcel = Path.GetExtension(FileName);
                    txtArchivo.Text = openFileDialog1.FileName;
                }

                else
                {
                    MessageBox.Show("Archivo Invalido", "Error de Archivo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }

        private void btnImportar_Click(object sender, EventArgs e)
        {
            switch (cmbImportar.SelectedIndex)
            {
                case 0: // CLIENTES
                    importarClientes();
                    break;
                case 1: // PRODUCTOS
                    importarProductos();
                    break;
                case 2: // USUARIOS
                    importarUsuarios();
                    break;
                default:
                    break;
            }      
        }

        // CLIENTES
        public void importarClientes()
        {
            Clientes cliente = new Clientes();
            int contAgregados = 0, contModificados = 0;
            Importar Excel = new Importar(txtArchivo.Text, true); // Carga el archivo de excel en el dataset de la clase "Importar"

            foreach (DataRow row in Excel.Archivo.Tables[0].Rows)
            {
                // Cargo las propiedades de los clientes con los valores de cada celda
                try
                {
                    cliente.SetPropiedades(row.ItemArray[0].ToString(),
                                           row.ItemArray[1].ToString(),
                                           row.ItemArray[2].ToString(),
                                           Convert.ToBoolean(row.ItemArray[3].ToString()));
                    if (existeCliente(row.ItemArray[0].ToString()))
                    {
                        cliente.ModificarCliente(Conexion.GetRutaConexion(), cliente);
                        contModificados++;
                    }
                    else
                    {
                        cliente.AltaCliente(Conexion.GetRutaConexion(), cliente);
                        contAgregados++;
                    }
                }
                catch
                {
                    MessageBox.Show("Error agregando la entrada " + row.ItemArray[0].ToString(), "Formato Invalido", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }

            MessageBox.Show(@"Se agregaron " + contAgregados + " y se modificaron " + contModificados + " clientes.");
        }

        public bool existeCliente(string DNICliente)
        {
            // Me fijo si ya existe esa entrada en la base de datos
            string consultaSQL = @"Select DNI FROM Clientes WHERE DNI = '" + DNICliente + "'";
            Conexion.CargarDataSet(consultaSQL, "Clientes");
            try
            {
                Conexion.GetDataSet().Tables[0].Rows[0].ItemArray[0].ToString();
                return true;
            }
            catch
            {
                return false;
            }
        }

        // USUARIOS
        public void importarUsuarios()
        {
            Usuarios usuario = new Usuarios();
            int contAgregados = 0, contModificados = 0;
            Importar Excel = new Importar(txtArchivo.Text, true); // Carga el archivo de excel en el dataset de la clase "Importar"
            // Recorre el dataset de Excel fila por fila
            foreach (DataRow row in Excel.Archivo.Tables[0].Rows)
            {
                // Cargo las propiedades de los usuarios con los valores de cada celda
                try
                {
                    usuario.SetPropiedades(row.ItemArray[0].ToString(), // IDUsuario
                                       row.ItemArray[1].ToString(), // Contraseña
                                       row.ItemArray[2].ToString(), // Nombre
                                       row.ItemArray[3].ToString(), // Apellido
                                       Convert.ToInt16(row.ItemArray[4].ToString()), // NivelAcceso
                                       Convert.ToBoolean(row.ItemArray[5].ToString())); // Activo
                    if (existeUsuario(row.ItemArray[0].ToString()))
                    {
                        usuario.ModificarUsuario(Conexion.GetRutaConexion(), usuario);
                        contModificados++;

                    }
                    else
                    {
                        usuario.AltaUsuarios(Conexion.GetRutaConexion(), usuario);
                        contAgregados++;
                    }
                }
                catch
                {
                    MessageBox.Show("Error agregando la entrada " + row.ItemArray[0].ToString(), "Formato Invalido", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }

            MessageBox.Show(@"Se agregaron " + contAgregados + " y se modificaron " + contModificados + " usuarios.");
        }

        public bool existeUsuario(string idUsuario)
        {
            // Me fijo si ya existe esa entrada en la base de datos
            string consultaSQL = @"Select IDUsuario FROM Usuarios WHERE IDUsuario = '" + idUsuario + "'";
            try
            {
                Conexion.CargarDataSet(consultaSQL, "Usuarios");
                Conexion.GetDataSet().Tables[0].Rows[0].ItemArray[0].ToString();
                return true;
            }
            catch
            {
                return false;
            }
        }

        // PRODUCTOS
        public void importarProductos()
        {

            if (ValidarEntradaImportacion())
            {
                //Se ejecuta la Importacion Excel SQL Server
                MessageBox.Show("Se iniciará la Importación");

                try
                {
                    string RutaDB = "Data Source=Localhost;Initial Catalog=TPVideoJuegos;Integrated Security=True";
                    SqlConnection Connection = new SqlConnection(RutaDB);
                    SqlCommand cmd = new SqlCommand();

                    ParametrosSPExcel(ref cmd);

                    Connection.Open();
                    cmd.Connection = Connection;
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.CommandText = "spInsertExcel";
                    cmd.ExecuteNonQuery();
                    Connection.Close();
                    MessageBox.Show("Se realizo la importación");
                }

                catch
                {
                    MessageBox.Show("Error");
                }


                //-- EL SP Recibe los siguientes datos para poder ejecutarse:

                // -- 0: Que quiere importar (clientes, usuarios, etc);
                // -- 1 : Formato de la hoja de Excel (.xls o .xlsx)
                // -- 2: Ubicación del Archivo de Excel (tiene que ser la ruta completa)
                // -- 3: Preguntar si la primera fila son cabeceras con nombre de columnas (HDR = YES/NO)
            }
        }


        private bool ValidarEntradaImportacion()
        {

            if (txtArchivo.Text.Trim() == "")
            {
                MessageBox.Show("No ha seleccionado ningun Archivo");
                return false;
            }

            else
            {
                return true;
            }

        }

        private void ParametrosSPExcel(ref SqlCommand cmd)
        {
            SqlParameter SqlParametros = new SqlParameter();

            SqlParametros = cmd.Parameters.Add("@FormatoExcel", SqlDbType.NChar, 10);
            SqlParametros.Value = FormatoExcel;

            SqlParametros = cmd.Parameters.Add("@RutaExcel", SqlDbType.NChar, 100);
            SqlParametros.Value = txtArchivo.Text;

            SqlParametros = cmd.Parameters.Add("@Cabecera", SqlDbType.NChar, 100);
            SqlParametros.Value = "Yes";
        }


        // TEMPLATES
        private void btnTemplate_Click(object sender, EventArgs e)
        {
            switch (cmbImportar.SelectedIndex)
            {
                case 0: // CLIENTES
                    byte[] templateClientes = Properties.Resources.Clientes;
                    File.WriteAllBytes("c:\\Clientes.xls", templateClientes);
                    System.Diagnostics.Process.Start("c:\\Clientes.xls");
                    break;
                case 1: // PRODUCTOS
                    byte[] templateProductos = Properties.Resources.Productos;
                    File.WriteAllBytes("c:\\Productos.xls", templateProductos);
                    System.Diagnostics.Process.Start("c:\\Productos.xls");
                    break;
                case 2: // USUARIOS
                    byte[] templateUsuarios = Properties.Resources.Usuarios;
                    File.WriteAllBytes("c:\\Usuarios.xls", templateUsuarios);
                    System.Diagnostics.Process.Start("c:\\Usuarios.xls");
                    break;
                default:
                    break;
            }


        }







    }
}
